package com.lap.framework.tools;

import lombok.experimental.UtilityClass;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 数字转换
 *
 * @author Shuisheng Lao(劳水生)
 * @version 0.0.1
 */
@UtilityClass
public class NumberStrategy {
  private static final BigDecimal BASE_SCALE = BigDecimal.valueOf(100);

  /**
   * 将分值除以100转换为元
   *
   * @param value 输入值（分）
   * @return 转换后的值（元）
   */
  public static Double divide100(Integer value) {
    if (value == null) {
      return 0.0;
    }
    return BigDecimal.valueOf(value).divide(BASE_SCALE, 2, RoundingMode.HALF_UP).doubleValue();
  }

  /**
   * 将元乘以100转换为分
   *
   * @param value 输入值（元）
   * @return 转换后的值（分）
   */
  public static Integer multiply100(Double value) {
    if (value == null) {
      return 0;
    }
    return BigDecimal.valueOf(value)
        .multiply(BASE_SCALE)
        .setScale(0, RoundingMode.HALF_UP)
        .intValue();
  }

  /**
   * 根据分母，将值（分）转换为元
   *
   * @param value 输入值（分）
   * @param denominator 分母
   * @return 转换后的值（元）
   */
  public static Double divide(Integer value, Double denominator) {
    return divide(value, denominator, 2);
  }

  /**
   * 根据分母，将值（分）转换为元
   *
   * @param value 输入值（分）
   * @param denominator 分母
   * @param scale 保留小数
   * @return 转换后的值（元）
   */
  public static Double divide(Integer value, Double denominator, Integer scale) {
    if (value == null || denominator == null || denominator.intValue() == 0) {
      return 0.0;
    }
    scale = (scale == null) ? 0 : scale;
    return BigDecimal.valueOf(value)
        .divide(BigDecimal.valueOf(denominator), scale, RoundingMode.HALF_UP)
        .doubleValue();
  }

  /**
   * 根据分母，将值（元）转换为分
   *
   * @param value 输入值（元）
   * @param denominator 转换因子（分母）
   * @return 转换后的值（分）
   */
  public static Integer multiply(Double value, Integer denominator) {
    if (value == null || denominator == null || denominator == 0) {
      return 0;
    }
    return BigDecimal.valueOf(value)
        .multiply(BigDecimal.valueOf(denominator))
        .setScale(0, RoundingMode.HALF_UP)
        .intValue();
  }
}
